[前言]
上一篇介紹完了基本的結構設計,也講了基本的CRUD。
但是,開發設計中,資料庫的結構是會變動的。
有時可能甚至於發生結構上的失策而需要改動型態之類的。
問題是,如果你單純只是去改結構,那麼在你下一次執行時,勢必會發生編譯錯誤。
因為Realm會自動去判斷你的資料結構是不是符合當前的狀態。
那麼一但你改動了結構,是否就必須有較大的設定改變呢?
其實,這一點,Realm真的都幫我們處理好了。
[設置]
(這邊的設置法則和官方的不太一樣,因為我覺得這樣比較好管理)
基本上,你只需要開個檔案(我檔名都叫RealmMigration.swift)
然後在其中寫入遷移設定就好了。這份設定檔的code基本上就是固定的。
所以其實照抄貼上就行了:
import Foundation
import RealmSwift
class RealmMigration {
func didApplicationLunch () {
self.migrationVersion()
}
func migrationVersion() {
let config = Realm.Configuration(
schemaVersion : 1 ,
migrationBlock : { migration , oldSchemaVersion in
// if (oldSchemaVersion < 1) {
// 如果你有必須針對舊板本遷移到新板本的資料改變,就寫在這裡。
// 詳細的做法可以參考官方的範例
// }
}
)
Realm.Configuration.defaultConfiguration = config
}
}
let realm = try! Realm() //不要理會這一行是不是會報黃色警告給你,寫在這完完全全就是讓realm這個變數變成全域使用。你就不用每一次都下這一行。
不過光是這樣設置是沒用的,因為這個class還沒有在app開啟時被執行。
如果你沒有預設在app執行時先跑這個class,那麼你改了結構就一樣會報error給你。
修改:AppDelegate.swift
在class AppDelegate中追加下面這行
let realmMigration:RealmMigration = RealmMigration()
將
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
return true
}
改成
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
self.realmMigration.didApplicationLunch()
return true
}
這時再執行編譯的話,之後遷移就會發生作用了。
至於改了結構要如何遷移?很簡單!
你只要去改版本號就好了。
例如現在的版本號是:
schemaVersion : 1 ,
你改了結構後,就把版本號加1就好了:
schemaVersion : 2 ,
在下一次的編譯中,他就會自動幫你遷移結構了。
但你改了結果卻沒有改版本號的話,就會發生錯誤。
--
[目次]
[Swift] Realm.io 資料庫介紹 - 其之一:初探CRUD
[Swift] Realm.io 資料庫介紹 - 其之二:Migrations 遷移
[Swift] Realm.io 資料庫介紹 - 其之三:查詢、排序、鍵結、自動更新、筆數